#include "BlockQueue.hpp"
#include <ctime>
#include <sys/types.h>
#include <unistd.h>
#include "Task.hpp"

int myadd(int x, int y)
{
    return x + y;
}

void *consumer(void* bq_)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(bq_);
    while(true)
    {
        // 消费活动
        Task t;
        bq->pop(&t);
        std::cout << "消费数据：" << t() << std::endl;
        // int data ;
        // bq->pop(&data);
        // std::cout << "消费数据：" << data << std::endl;
        sleep(1);
    }
    return nullptr;
}

void *productor(void* bq_)
{
    BlockQueue<int> *bq = static_cast<BlockQueue<int> *>(bq_);
    while(true)
    {
        // 生产活动
        int x = rand() % 10 + 1; // 在这里我们先用随机数，构建一个数据
        int y = rand() % 5 + 1;
        Task t(x,y,myadd);
        bq->push(t);

        // int data = rand() % 10 + 1;
        // bq->push(data);
        // std::cout << "生产数据：" << data << std::endl;
    }
    return nullptr;
}


int main()
{
    srand((unsigned long) time (nullptr) ^ getpid());
    BlockQueue<int> *bq = new BlockQueue<int>();
    pthread_t c,p;
    pthread_create(&c,nullptr,consumer,bq); // 第四个参数让c,p看到同一份资源
    pthread_create(&p,nullptr,productor,bq);

    pthread_join(c,nullptr);
    pthread_join(p,nullptr);

}